/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/8/26 23:47
 * 串行和并行（多线程） 执行程序的效率比较
 *  串行 time = 719ms  742ms
 *  并发 time = 377ms  376ms
 *
 *  速度确实提高了
 *      但并不一定是2倍的关系，线程调度自身也有开销
 *          一个线程调度若干次，和两个线程调度若干次
 *          次数不确定，故而不一定是2倍数关系
 */
public class ThreadDemo7 {
    private static final long count = 10_0000_0000L;
    //串行 来实现对a,b的自增
    public static void serial(){
        //System.currentTimeMillis() 获取当前系统毫秒级时间戳
        long start = System.currentTimeMillis();
        int a = 0;
        for (int i = 0; i < count; i++) {
            a++;
        }
        int b = 0;
        for (int i = 0; i < count; i++) {
            b++;
        }
        long end = System.currentTimeMillis();
        System.out.println("串行 time = "+(end-start)+"ms");
    }
    //并行（多线程） 实现对a,b的自增
    public static void concurrency(){
        long start = System.currentTimeMillis();

        Thread t1 = new Thread(){
            @Override
            public void run() {
                int a = 0;
                for (int i = 0; i < 10; i++) {
                    a++;
                    System.out.println("t1");
                }
            }
        };
        t1.start();

        Thread t2 = new Thread(){
            @Override
            public void run() {
                int b = 0;
                for (int i = 0; i <10; i++) {
                    b++;
                    System.out.println("t2");
                }
            }
        };
        t2.start();
        //需要保证t1,t2都执行完了，在结束计时
        try {
            //join就是等待对应的线程结束
            //当t1,t2没有执行完之前，join方法就会阻塞等待
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        long end = System.currentTimeMillis();
        System.out.println("并发 time = "+(end-start)+"ms");
    }
    public static void main(String[] args) {
        serial();
        concurrency();
    }
}
